//
//  main.m
//  C03_循环结构
//
//  Created by dllo on 15/11/19.
//  Copyright © 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
   
#pragma mark - 知识点1 for循环
    {
#if 0
        for (变量初始化; 条件表达式; 变量增量) {
            循环体语句;
        }
        流程:
        1.变量初始化
        2.判断条件表达式(真\假)
        3.如果条件表达式为之真,执行循环体语句
        4.执行变量增量
        5.再次判断条件表达式
        6.如果此时表达式为假,退出整个循环.
#endif
    }
#pragma mark ** 练习
    {
#if 0
        /**
         * 练习1: 打印5次"hello, lanou!"
         */
        for (int i = 0; i < 5; i++) {
            printf("Hello, Lanou!\n");
        }
#endif
#if 0
        /** 练习2:正序打印1-5的数 */
        for (int i= 0; i < 5; i++) {
            printf("%d\n", i + 1);
        }
#endif
#if 0
        /** 练习2:倒序打印1-5的数 */
        for (int i = 0; i < 5; i++) {
            printf("%d\n",5 - i);
        }
#endif
#if 0
        /** 练习3:打印1~100之间的偶数 */
        for (int i = 1; i < 100; i++) {
            if (i % 2 == 0) {
                printf("%d\n", i);
            }
        }
#endif
        /** 练习4 */
        /** 用for循环打印出1~100之间7的倍数 */
#if 0
        for (int i = 1; i < 100; i++) {
            if (i % 7 == 0) {
                printf("%d\n",i);
            }
        }
#endif
        /** 用for循环打印出1~100之间个位为7的数 */
#if 0
        for (int i = 1; i < 100; i++) {
            if (i % 10 == 7) {
                printf("%d\n",i);
            }
        }
#endif
        /** 用for循环打印出1~100之间十位为7的数 */
#if 0
        for (int i = 1; i < 100; i++) {
            if (i / 10 == 7) {
                printf("%d\n",i);
            }
        }
#endif
        /** 用for循环打印出1~100之间既不是7的倍数并且也不包含7的数 */
#if 0
        for (int i = 1; i < 100; i++) {
            if (i % 7 != 0 && i % 10 != 7 && i / 10 !=7) {
                printf("%d\n",i);
            }
        }
#endif
    }
#pragma mark - 知识点2 break, continue
    {
        /** 
         * break 跳出本层循环
         * continue 跳出本次循环
         */
    }
#pragma mark ** 练习
    {
#if 0
        /** break
         * 练习1:判断一个数是否是质数
         */
        int number = 0;
        BOOL isZhi = NO;
        printf("请输入一个整数:");
        scanf("%d", &number);
        for (int i = 2; i < number; i++) {
            
            /** 从2开始除 */
            
            if (number % i == 0) {
                isZhi = NO;
                break;
            } else {
                isZhi = YES;
            }
        }
        if (isZhi == YES) {
            printf("是质数\n");
        } else {
            printf("不是质数\n");
        }
#endif
    }
#pragma mark - 知识点3 随机数
    {
        /** 
         * 公式: arc4random() % (b - a + 1) + a 
         */
        
    }
#pragma mark ** 练习
    {
#if 0
        /** 练习1:用for打印10个随机数(范围为10~30),求最大值和最小值 */
        int max = 0;
        int min = 30;
        for (int i = 0; i < 10; i++) {
            int random = arc4random() % (30 - 10 + 1) + 10;
            printf("%4d",random);
            /** 和最大值比较 */
            if (random > max) {
                max = random;
            }
            /** 和最小值比较 */
            if (random < min) {
                min = random;
            }
        }
        printf("\n");
            /** 10次循环之后输出最终结果 */
        printf("max = %d\n",max);
        printf("min = %d\n",min);
#endif
    }
#pragma mark - 循环嵌套练习
    {
#if 0
        /** 练习1: 打印一行 1, 2, 3, 4, 5 */
        for (int i = 0; i < 5; i++) {
            printf("%d ",i + 1);
        }
        printf("\n");
#endif
        /** 练习2: 打印三行 1, 2, 3, 4, 5 */
#if 0
        /** 确定行数:3行 */
        for (int i = 0; i < 3; i++) {
            
            /** 循环体内相当于每行的输出 */
            
            for (int j = 0; j < 5; j++) {
                printf("%d ", j + 1);
            }
            /** 每行结束之后加一个换行符 */
            printf("\n");
        }
#endif
#if 0
        /** 练习3:
            1
            1 2
            1 2 3
            1 2 3 4
            1 2 3 4 5 */
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < i + 1; j++) {
                printf("%d ", j + 1);
            }
            printf("\n");
        }
#endif
#if 0
        /**
         * 练习4: 打印如下图形：
         1 2 3 4 5
         1 2 3 4
         1 2 3
         1 2
         1
         */
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5 - i; j++) {
               printf("%d ",j + 1);
            }
            printf("\n");
        }
#endif
#if 0
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < i + 1; j++) {
                printf("%d * %d = %-2d  ",j + 1, i + 1,(j + 1) * (i + 1));
            }
            printf("\n");
        }
#endif
#if 0
        for (int i = 1; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    printf("%d%d%d ", i,j,k);
                }
            }
        }
#endif
    }
#pragma mark - 知识点4 while循环
    {
#if 0
        while (条件表达式) {
            语句;
        }
        
        流程:
        1.判断条件表达式
        2.如果表达式结果为真,执行语句.
        3.再次判断条件表达式
#endif
    }
#pragma mark ** 练习
    {
        /**
         * 练习1:
         * 用while循环打印出1~100之间7的倍数。
         * 用while循环打印出1~100之间个位为7的数。
         * 用while循环打印出1~100之间十位为7的数。
         * 用while循环打印出1~100之间既不是7的倍数并且也不包含7的数。
         */
#if 0
        int i = 1;
        while (i <= 100) {
            if (i % 7 == 0) {
                printf("%d\n", i);
            }
            i++;
        }
#endif
#if 0
        int i = 1;
        while (i <= 100) {
            if (i % 10 == 7) {
                printf("%d\n", i);
            }
            i++;
        }
#endif
#if 0
        int i = 1;
        while (i <= 100) {
            if (i / 10 == 7) {
                printf("%d\n", i);
            }
            i++;
        }
#endif
#if 0
        int i = 1;
        while (i <= 100) {
            if (i % 7 != 0 && i % 10 != 7 && i / 10 != 7) {
                printf("%d\n", i);
            }
            i++;
        }
#endif
#if 0
        int number = 0;
        while (1) {
            printf("请输入一个数(输入0退出程序):");
            scanf("%d", &number);
            if (0 == number) {
                return 0;   /** 函数返回,跳出当前函数,程序结束 */
            }
            printf("刚才输入的整数是:%d\n",number);
        }
#endif
        /** 请输入一个整数,判断是否为质数,结果打印出来,当输入0时,退出程序 */
#if 0
        int number = 0;
        BOOL isZhi = YES;
        while (1) {
            printf("请输入一个数(0退出):");
            scanf("%d", &number);
            // 输入0直接退出
            if (0 == number) {
                return 0;
            }
            
            // 判断是否是质数
            for (int i = 2; i < number; i++) {
                if (number % i == 0) {
                    isZhi = NO;
                    break;   /** 跳出for循环,但是不跳出while循环 */
                } else {
                    isZhi = YES;
                    
                }
            }
            
            
            if (isZhi == YES) {
                printf("该数是质数!\n");
            } else {
                printf("该数不是质数!\n");
            }
            
        }
        
#endif
    }
#pragma mark - 知识点5 do...while循环
    {}
#pragma mark ** 练习
    {
        /** 练习1:输入一个整数,求这个整数的位数 */
#if 0
        int count = 0;
        int number2 = 0;
        printf("请输入一个整数:");
        scanf("%d", &number2);
        do {
            count++;
        } while (number2 /= 10);
        printf("位数是:%d\n", count);
#endif
    }
    
    
    return 0;
}
